package controller;

import eccezioni.CampoErratoException;
import entity.IndirizzoAbitazione;
import entity.IndirizzoEmail;
import entity.UtenteRegistrato;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import sbForEntityClasses.IndirizzoAbitazioneFacadeLocal;
import sbForEntityClasses.IndirizzoEmailFacadeLocal;
import sbForEntityClasses.UtenteRegistratoFacadeLocal;
import utilities.Regexp;
import utilities.googleMap.DistanceMatrix;

/**
 * Metodi per la gestione del profilo utente
 * @author Ale
 */
@Stateless
public class ControllerProfilo implements ControllerProfiloLocal {

    @EJB
    private IndirizzoEmailFacadeLocal indirizzoEmailFacade;
    @EJB
    private UtenteRegistratoFacadeLocal utenteRegistratoFacade;
    @EJB
    private ControllerGMapsLocal controllerGMaps;
    @EJB
    private ControllerComuniLocal controllerComuni;
    @EJB
    private IndirizzoAbitazioneFacadeLocal indirizzoAbitazioneFacade;

    /**
     * Permette di modificare il numero di telefono di un utente
     * @param utenteLoggato utente di cui modificare il profilo
     * @param telefono nuovo numero di telefono
     * @throws CampoErratoException se telefono non è un numero di telefono valido
     */
    @Override
    public void modificaTelefono(UtenteRegistrato utenteLoggato, String telefono) throws CampoErratoException {
        if (!Regexp.checkAlphanumeric(telefono, true)) {
            throw new CampoErratoException("<li>" + telefono + " non &egrave; un numero di telefono valido</li>");
        }
        utenteLoggato.setTelefono(telefono);
        utenteRegistratoFacade.edit(utenteLoggato);
    }

    /**
     * Permette di modificare l'indirizzo dell'abitazione di un utente
     * @param utenteLoggato utente di cui modificare il profilo
     * @param indirizzo nuovo indirizzo
     * @throws CampoErratoException se l'indirizzo non è riconosciuto
     */
    @Override
    public void modificaIndirizzo(UtenteRegistrato utenteLoggato, String indirizzo) throws CampoErratoException {
        if (!controllerGMaps.isUniqueAddress(indirizzo)) {
            throw new CampoErratoException("<li>l'indirizzo \"" + indirizzo + "\" non &egrave; stato riconosciuto</li>");
        }
        IndirizzoAbitazione i = new IndirizzoAbitazione();
        i.setDescrizione(indirizzo);
        String comune = DistanceMatrix.getLocality(indirizzo);
        i.setRegione(controllerComuni.getRegion(comune));
        indirizzoAbitazioneFacade.create(i);
        utenteLoggato.setIndirizzo(i);
        utenteRegistratoFacade.edit(utenteLoggato);
    }

    /**
     * Permette di modificare la mail dell'account PayPal di un utente
     * @param utenteLoggato utente di cui modificare il profilo
     * @param paypal nuova mail
     * @throws CampoErratoException se paypal non è un indirizzo e-mail valido
     */
    @Override
    public void modificaPaypal(UtenteRegistrato utenteLoggato, String paypal) throws CampoErratoException {
        if (!Regexp.checkEmail(paypal, true)) {
            throw new CampoErratoException("<li>" + paypal + " non &egrave; un indirizzo e-mail valido</li>");
        }
        IndirizzoEmail pp = utenteLoggato.getPaypal().getIndirizzoPostaPayPal();
        pp.setIndirizzo(paypal);
        indirizzoEmailFacade.edit(pp);
    }

    /**
     * Imposta il Facebook id di un utente
     * @param ur utente di cui impostare il facebook id
     * @param id facebook id
     */
    @Override
    public void setFacebookId(UtenteRegistrato ur, String id) {
        ur.setFacebookId(id);
        utenteRegistratoFacade.edit(ur);
    }
    
}
